{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-26T01:46:28.195507Z",
     "start_time": "2020-03-26T01:46:12.130698Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.utils import shuffle\n",
    "from sklearn.model_selection import train_test_split\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from cvxopt import matrix, solvers\n",
    "from tqdm import tqdm_notebook\n",
    "%matplotlib inline\n",
    "\n",
    "MAX_ITERATION = 10000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-26T01:46:28.244353Z",
     "start_time": "2020-03-26T01:46:28.205454Z"
    }
   },
   "outputs": [],
   "source": [
    "def data_generator(inland):\n",
    "    if inland == False:\n",
    "        X1 = np.array([[119.28, 26.08],    # 福州\n",
    "                       [121.31, 25.03],    # 台北\n",
    "                       [121.47, 31.23],    # 上海\n",
    "                       [118.06, 24.27],    # 厦门\n",
    "                       [121.46, 39.04],    # 大连\n",
    "                       [122.10, 37.50],    # 威海\n",
    "                       [124.23, 40.07]])   # 丹东\n",
    "\n",
    "        X2 = np.array([[129.87, 32.75],    # 长崎\n",
    "                       [130.33, 31.36],    # 鹿儿岛\n",
    "                       [131.42, 31.91],    # 宫崎\n",
    "                       [130.24, 33.35],    # 福冈\n",
    "                       [133.33, 15.43],    # 鸟取\n",
    "                       [138.38, 34.98],    # 静冈\n",
    "                       [140.47, 36.37]])   # 水户\n",
    "        y1 = np.full(X1.shape[0], -1)\n",
    "        y2 = np.ones(X2.shape[0])\n",
    "\n",
    "        X_train = np.concatenate((X1, X2), axis=0)\n",
    "        y_train = np.concatenate((y1, y2))\n",
    "        X_train, y_train = shuffle(X_train, y_train)\n",
    "        X_test = np.array([[123.28, 25.45]])\n",
    "        y_test = np.array([-1])\n",
    "\n",
    "        return X_train, y_train, X_test, y_test\n",
    "\n",
    "    else:\n",
    "        X1 = np.array([[119.28, 26.08],    # 福州\n",
    "                       [121.31, 25.03],    # 台北\n",
    "                       [121.47, 31.23],    # 上海\n",
    "                       [118.06, 24.27],    # 厦门\n",
    "                       [113.53, 29.58],    # 武汉\n",
    "                       [104.06, 30.67],    # 成都\n",
    "                       [116.25, 39.54],    # 北京\n",
    "                       [121.46, 39.04],    # 大连\n",
    "                       [122.10, 37.50],    # 威海\n",
    "                       [124.23, 40.07]])   # 丹东\n",
    "\n",
    "        X2 = np.array([[129.87, 32.75],    # 长崎\n",
    "                       [130.33, 31.36],    # 鹿儿岛\n",
    "                       [131.42, 31.91],    # 宫崎\n",
    "                       [130.24, 33.35],    # 福冈\n",
    "                       [136.54, 35.10],    # 名古屋\n",
    "                       [132.27, 34.24],    # 广岛\n",
    "                       [139.46, 35.42],    # 东京\n",
    "                       [133.33, 15.43],    # 鸟取\n",
    "                       [138.38, 34.98],    # 静冈\n",
    "                       [140.47, 36.37]])   # 水户\n",
    "        y1 = np.full(X1.shape[0], -1)\n",
    "        y2 = np.ones(X2.shape[0])\n",
    "\n",
    "        X_train = np.concatenate((X1, X2), axis=0)\n",
    "        y_train = np.concatenate((y1, y2))\n",
    "        X_train, y_train = shuffle(X_train, y_train)\n",
    "        X_test = np.array([[123.28, 25.45]])\n",
    "        y_test = np.array([-1])\n",
    "\n",
    "        return X_train, y_train, X_test, y_test\n",
    "\n",
    "\n",
    "def primal_SVM(X, y):\n",
    "    X = np.concatenate((np.ones((X.shape[0], 1)), X), axis=1)\n",
    "    N, d = X.shape\n",
    "    temp = np.eye(d)\n",
    "    temp[0, 0] = 0.0\n",
    "    Q = matrix(temp)\n",
    "    p = matrix(-np.zeros(d))\n",
    "    G = matrix(-y.reshape(-1, 1) * X)\n",
    "    h = matrix(-np.ones(N))\n",
    "\n",
    "    sol = solvers.qp(Q, p, G, h)\n",
    "    w = np.array(sol['x']).reshape(-1)\n",
    "    print('Final weight vector is:', w)\n",
    "\n",
    "    return w\n",
    "\n",
    "\n",
    "def dual_SVM(X, y):\n",
    "    N = X.shape[0]\n",
    "    temp = y.reshape(-1, 1) * X\n",
    "    Q = matrix(np.dot(temp, temp.T).astype(np.double))\n",
    "    p = matrix(-np.ones(N))\n",
    "    G = matrix(-np.eye(N)[range(0, N)])\n",
    "    h = matrix(np.zeros(N))\n",
    "    A = matrix(y.astype(np.double), (1, N))\n",
    "    b = matrix(0.0)\n",
    "\n",
    "    sol = solvers.qp(Q, p, G, h, A, b)\n",
    "    alpha = np.array(sol['x']).reshape(-1)\n",
    "    w = np.dot(alpha * y, X)\n",
    "    non_zero_index = np.where(np.abs(alpha) > 1e-6)[0][0]\n",
    "    b = y[non_zero_index] - np.dot(w, X[non_zero_index])\n",
    "    w = np.append(b, w)\n",
    "    print('Final weight vector is:', w)\n",
    "    \n",
    "    return w\n",
    "\n",
    "\n",
    "def SVM_pegasos(X, y, w_init, max_iter, weight_decay, lr, eps=1e-6):\n",
    "    w = w_init\n",
    "    X = np.concatenate((np.ones((X.shape[0], 1)), X), axis=1)\n",
    "    diff = np.zeros(3)\n",
    "\n",
    "    for t in tqdm_notebook(range(max_iter)):\n",
    "        diff = weight_decay * w\n",
    "        for n in range(len(X)):\n",
    "            if y[n]*np.dot(w, X[n]) < 1:\n",
    "                diff += -y[n]*X[n]\n",
    "        w_ = w - lr/(t+1) * diff\n",
    "        delta = np.linalg.norm(w - w_)\n",
    "        if delta < eps:\n",
    "            break\n",
    "        else:\n",
    "            w = w_\n",
    "    print('Final weight vector is:', w)\n",
    "    \n",
    "    return w\n",
    "\n",
    "\n",
    "def SVM_drawer(X_train, y_train, X_test, y_test, w):\n",
    "    fig, ax = plt.subplots(1, 1, figsize=(10, 10))\n",
    "\n",
    "    for i in range(len(y_train)):\n",
    "        if y_train[i] == 1:\n",
    "            ax.scatter(X_train[i, 0], X_train[i, 1], c='r', marker='o')\n",
    "        else:\n",
    "            ax.scatter(X_train[i, 0], X_train[i, 1], c='b', marker='x')\n",
    "\n",
    "    for i in range(len(y_test)):\n",
    "        if y_test[i] == 1:\n",
    "            ax.scatter(X_test[i, 0], X_test[i, 1], c='r', s=200, marker='*')\n",
    "        else:\n",
    "            ax.scatter(X_test[i, 0], X_test[i, 1], c='b', s=200, marker='*')\n",
    "\n",
    "    l_x = np.linspace(100, 150, X_train.shape[0])\n",
    "#     l_x = np.linspace(np.min(X_train)-0.5, np.max(X_train)+0.5, X_train.shape[0])\n",
    "    l_y = -(w[0]/w[2]+w[1]/w[2]*l_x)\n",
    "    ax.plot(l_x, l_y)\n",
    "    xy_max = np.max(X_train, axis=0)\n",
    "    xy_min = np.min(X_train, axis=0)\n",
    "    ax.set(xlim=(100, 150), ylim=(15, 45),\n",
    "           xlabel=\"x\",\n",
    "           ylabel=\"y\",\n",
    "           title=\"SVM\")\n",
    "#     ax.set(xlim=(xy_min[0]-0.5, xy_max[0]+0.5), ylim=(xy_min[1]-0.5, xy_max[1]+0.5),\n",
    "#            xlabel=\"x\",\n",
    "#            ylabel=\"y\",\n",
    "#            title=\"Dual SVM\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Primal SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-25T16:25:32.479594Z",
     "start_time": "2020-03-25T16:25:32.253170Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     pcost       dcost       gap    pres   dres\n",
      " 0:  9.0724e-03  6.3515e+00  4e+01  2e+00  1e+02\n",
      " 1:  8.1712e-02 -7.4726e+00  1e+01  4e-01  3e+01\n",
      " 2:  1.1719e-01 -1.2084e-01  2e-01  4e-03  4e-01\n",
      " 3:  5.4376e-02  2.4933e-02  3e-02  6e-15  2e-14\n",
      " 4:  4.2043e-02  3.8454e-02  4e-03  4e-15  4e-14\n",
      " 5:  4.1638e-02  4.1578e-02  6e-05  4e-15  7e-14\n",
      " 6:  4.1624e-02  4.1624e-02  6e-07  3e-15  3e-14\n",
      " 7:  4.1624e-02  4.1624e-02  6e-09  4e-15  4e-14\n",
      "Optimal solution found.\n",
      "Final weight vector is: [-33.98333018   0.28323918  -0.05499058]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X_train, y_train, X_test, y_test = data_generator(inland=False)\n",
    "w = primal_SVM(X_train, y_train)\n",
    "SVM_drawer(X_train, y_train, X_test, y_test, w)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-25T16:25:35.502451Z",
     "start_time": "2020-03-25T16:25:35.200258Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     pcost       dcost       gap    pres   dres\n",
      " 0:  4.5703e-03  1.5099e+01  6e+01  2e+00  3e+02\n",
      " 1:  4.6198e-02 -1.1101e+01  2e+01  5e-01  9e+01\n",
      " 2:  8.0671e-02 -1.1034e+00  1e+00  2e-02  5e+00\n",
      " 3:  7.1962e-02  1.2370e-02  6e-02  7e-15  2e-13\n",
      " 4:  4.2696e-02  3.4933e-02  8e-03  4e-15  7e-14\n",
      " 5:  4.1747e-02  4.1277e-02  5e-04  5e-15  4e-14\n",
      " 6:  4.1625e-02  4.1621e-02  5e-06  3e-15  8e-14\n",
      " 7:  4.1624e-02  4.1624e-02  5e-08  3e-15  3e-14\n",
      "Optimal solution found.\n",
      "Final weight vector is: [-33.98333476   0.28323921  -0.05499059]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmcAAAJcCAYAAAC8DwN/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3de5Cld13n8c/39L3n0idDJplLkwxFRVFZCDqw1KK7bHCLiBTirQp3lLBQNbIrte0sCsZsaSMbFVwdR2q1agRNxFZkkS2o4NaaQqKlVtABIhfDTc2Efs5MMgnn6enMeU7fznf/eM7pPj3pnunLec5ze7+quk6f55zu/uIDx8/8Lt+fubsAAACQDZW0CwAAAMAawhkAAECGEM4AAAAyhHAGAACQIYQzAACADCGcAQAAZAjhDAAAIEMIZwAKxcy+28z+1szmzOybZvY3ZvY9ZnbFzPZt8P7PmdnbzOyYmbmZffaq1280s0Uze6xv/yEAlBrhDEBhmNl+SQ9Iep+kA5KOSnqXpDlJs5J++Kr3v1DSt0v6467Le9rXO/6jpH9JsGwAWIdwBqBIvkWS3P2P3X3F3SN3/3N3/7yk+yW98ar3v1HSJ9z96a5rH5R011Xv+YMkiwaAboQzAEXyVUkrZna/mX2fmd3Q9doHJX2Pmd0iSWZWUTwqdnXw+kNJbzCzATP7Nkn7JH26D7UDgCTCGYACcffLkr5bkkv6XUmXzOzjZnazu39D0l9K+vH2218laVTSJ676NbOSviLpexWPoDFqBqCvCGcACsXdH3X3N7n7pKQXSjoi6TfbL3dPbf6EpD9y96UNfs0fSHqTpB9TPJIGAH1DOANQWO7+ZUn3KQ5pkvRRSUfN7N9L+iFtPir2p5K+X9I/u/v5pOsEgG6DaRcAAL1iZi9QHKr+xN1nzey5ike/HpYkd79iZh+R9PuSzrv7uY1+T/t9d0iq96l0AFjFyBmAIpmX9K8lfdrMrigOZV+U9Pau99wv6VZdZy2Zu59z939KqlAA2Iy5e9o1AAAAoI2RMwAAgAxJPJy1ewV9zsweaD+/z8z+xcweaX/dnnQNAAAAedGPDQFTkh6VtL/r2s+6+0f68LcBAAByJdGRMzObVLxz6v1J/h0AAICiSHrk7DclvUPx8Sfd7jWzX5D0SUk/5+4LV/+gmZ2UdFKS9uzZ810veMELEi4VALIlbCzpG/WGvuXmfRoZZIkwkBef+cxnnnL3gzv9+cR2a5rZayW9xt3/i5m9UtLPuPtrzeywpIuShiWdlfRP7v5L1/pdx48f93PnNmxHBACF9b8+9XX92v/7iv7xl16t8WHaUgJ5YWafcffjO/35JP8p9gpJrzOzxyR9SNIdZvaH7n7BYwuKG0G+LMEaACC3gjDSgT3DBDOgZBILZ+5+t7tPuvsxSW+Q9Bfu/uPtkTOZmUl6veIGkQCAqwT1SEeqo2mXAaDP0vjn2IyZHZRkkh6R9NYUagCAzAvCSM8/uCftMgD0WV/Cmbs/JOmh9vd39ONvAkCeubtqYaR/e9uO1xQDyCm2/wBABoWNJTUWV5jWBEqIcAYAGRSEkSRp8oaxlCsB0G+EMwDIoE44O1IlnAFlQzgDgAwK6nE4O0o4A0qHcAYAGVQLI40OVXRgz3DapQDoM8IZAGRQEEY6Uh1T3BISQJkQzgAgg2phxJQmUFKEMwDIoIBwBpQW4QwAMqa5tKKnnlkknAElRTgDgIyptdtoHKXHGVBKhDMAyBh6nAHlRjgDgIxZHTkjnAGlRDgDgIwJ6pEqJh2a4FxNoIwIZwCQMbNhpJv3j2pogI9ooIz4Xz4AZAw9zoByI5wBQMZ0TgcAUE6EMwDIkJWW6+JckzYaQIkRzgAgQy7NL2hpxZnWBEqMcAYAGRKEDUm00QDKjHAGABkShE1JnA4AlBnhDAAyJKhzOgBQdoQzAMiQIGxoYmxIe0cG0y4FQEoIZwCQIbWwyXozoOQIZwCQIUGdHmdA2RHOACBDamGkSTYDAKVGOAOAjJiLljS/sKwjVQ48B8qMcAYAGdHZqXm0Op5yJQDSRDgDgIyohe1wxrQmUGqEMwDIiCDs9DhjWhMoM8IZAGRELYw0PFjRjXtG0i4FQIoIZwCQEbNhpCMTo6pULO1SAKSIcAYAGRHUI9abASCcAUBW1MKI0wEAEM4AIAsWllf05PwCpwMAIJwBQBZcnGtKEiNnAAhnAJAFqw1oWXMGlB7hDAAyYLbTgJaRM6D0CGcAkAG1MJKZdGiCBrRA2RHOACADgnqkg3tHNDI4kHYpAFJGOAOADKjN0eMMQIxwBgAZENTpcQYgRjgDgJS1Wq5a2CScAZBEOAOA1D11ZUGLKy2mNQFIIpwBQOo6Pc6OTBDOABDOACB1QUgDWgBrCGcAkLIa4QxAF8IZAKQsqEfaNzKo/aNDaZcCIAMIZwCQsiBsMmoGYBXhDABSFoSRjtBGA0Ab4QwAUhbUG/Q4A7CKcAYAKZpvLulyc5lpTQCrCGcAkKJa2JQkpjUBrCKcAUCKVttoEM4AtBHOACBFs+1wNsm0JoA2whkApCioRxoaMB3cO5J2KQAygnAGACmqhZEOT4ypUrG0SwGQEYQzAEhR3ONsNO0yAGQI4QwAUlQLIx2tjqddBoAMIZwBQEqWVlp64jJHNwFYj3AGACm5ONdUy6WjTGsC6EI4A4CUBKs9zpjWBLCGcAYAKQnqcThjQwCAboQzAEhJ53QAjm4C0I1wBgApCcJIN+4d0ejQQNqlAMgQwhkApCQIIzYDAHgWwhkApCQII9poAHgWwhkApMDdVQsjHZkgnAFYj3AGACl4+sqimkstRs4APAvhDABSUFvtcUY4A7Ae4QwAUrDW44xwBmA9whkApKBzOsAk05oArkI4A4AUBGGkPcMDmhgbSrsUABlDOAOAFAT1SEeqYzKztEsBkDGEMwBIQW2OHmcANkY4A4AUdEbOAOBqhDMA6LPG4rLqjSXaaADYEOEMAPqsxk5NANdAOAOAPpulxxmAayCcAUCf1cKmJE4HALAxwhkA9FkQNjRQMd20byTtUgBkEOEMQKG4X/t5FtTCpg7tH9XgAB/BAJ6NTwYAhTE9LZ06tRbI3OPn09NpVvVsQZ0eZwA2l3g4M7MBM/ucmT3Qfv48M/u0mX3NzP7EzIaTrgFA8blLYSidObMW0E6dip+HYbZG0IIwYr0ZgE31Y+RsStKjXc/fI+m0u98mqS7pLX2oAUDBmUmnT0tTU3Egq1Tix6mp+HpWTklaXmnp4uUm4QzAphINZ2Y2Ken7Jb2//dwk3SHpI+233C/p9UnWAKA8OgGtW5aCmSQ9Mb+glZbTRgPAppIeOftNSe+Q1Go/f46k0N2X289nJR3d6AfN7KSZnTOzc5cuXUq4TABF0JnK7Na9Bi0LOg1oWXMGYDOJhTMze62kJ939M92XN3jrhh+b7n7W3Y+7+/GDBw8mUiOA4uheYzY1JbVaa1OcWQpoQbsBLdOaADYzmODvfoWk15nZaySNStqveCStamaD7dGzSUm1BGsAUBJmUrW6fo1ZZ4qzWs3O1GYQdk4HGE25EgBZlVg4c/e7Jd0tSWb2Skk/4+4nzOx/S/oRSR+SdJekjyVVA4BymZ6OR8g6QawT0LISzKQ4nB3YM6zx4ST/bQwgz9Loc/ZOSf/NzL6ueA3aB1KoAUhFHhqk5t3VQSxLwUxq9zhjShPANfTln27u/pCkh9rf/7Okl/Xj7wJZMj0d99vqjOR01khVq9lrkorkBGGk5x/ck3YZADKMEwKAPshTg1Qkx91VCyMdrY6nXQqADGPRA9AH3YvTz5yJv6TsNUhFssLGkhqLK2wGAHBNjJwBfZKHBqlIVmen5iQ9zgBcA+EM6JM8NEhFsjrhjGlNANdCOAP6IC8NUpGsTgNapjUBXAtrzoA+yEuDVCSrFkYaHarowJ7htEsBkGGEM6BP8tAgFckKwkhHqmMybjqAa2BaE+ijrDdI7RWa7W4sbqPBZgAA10Y4A9BT09Pr19F11tvRaDceOWOnJoDrIZwB6Bma7W6uubSip55Z1JEJwhmAa2PNGYCeodnu5mqdNhqMnAG4DkbOAPQUzXY31ulxdoQ1ZwCug3AGoKdotrux1ZEzwhmA6yCcAegZmu1uLqhHqph0aIIGtACujTVnAHqGZrubmw0j3bx/VEMD/JsYwLURzgD0FM12N0aPMwBbxT/hAPRcWZrtbkfndAAAuB7CGQAkbKXlujjXpI0GgC0hnAFAwi7NL2hpxZnWBLAlhDMASFgQNiTRRgPA1hDOACBhQdiUxOkAALaGcAYACQvqnA4AYOsIZwCQsCBsaGJsSHtH6F4E4PoIZwCQsFrYZL0ZgC0jnAFAwoI6Pc4AbB3hDAASVgsjTbIZAMAWEc4AIEFz0ZLmF5aZ1gSwZYQzAEgQOzUBbBfhDAASVAvjcEaPMwBbRTgDgAQFYWfkbDTlSgDkBeEMABJUCyMND1Z0456RtEsBkBOEMwBI0GwY6Wh1TJWKpV0KgJwgnAFAguIeZ0xpAtg6whkAJKjWHjkDgK0inAFAQhaWV/Tk/AJtNABsC+EMQN+5X/t5UVyca0oSI2cAtoVwBqCvpqelU6fWApl7/Hx6Os2qktFpQEuPMwDbQTgD0DfuUhhKZ86sBbRTp+LnYVi8EbTZTgNaRs4AbMNg2gUAKA8z6fTp+PszZ+IvSZqaiq9bwbpN1MJIZtLhCcIZgK1j5AxAX3UHtI4iBjMpnta8ad+Ihgf5qAWwdXxiAOirzlRmt+41aEVSm4vYqQlg2whnAPqme43Z1JTUasWP3WvQiiSo0+MMwPax5gxA35hJ1er6NWadKc5qtVhTm62WqxY29ervOJR2KQByhnAGoK+mp+MRsk4Q6wS0IgUzSXrqyoIWV1q00QCwbUxrAui7q4NY0YKZ1NXjjGlNANtEOAOABNTC+HQANgQA2C7CGQAkIAgbkjgdAMD2Ec4AIAFBPdK+kUHtHx1KuxQAOUM4A4AEBGGTUTMAO0I4A4AEBCE9zgDsDOEMABIQ1BtsBgCwI4QzAOix+eaSLjeXmdYEsCOEMwDoMdpoANgNwhkA9FgtpAEtgJ0jnAFAj822w9kk05oAdoBwBgA9FtQjDQ2YDu4dSbsUADlEOAOAHquFkQ5PjKlSKeChoQASRzgDgB6jxxl6bmZGOnZMqlTix5mZtCtCgghnANBjtTBipyZ6Z2ZGOnlSOn9eco8fT54koBUY4QwAemhppaUnLnN0E3ronnukRmP9tUYjvo5CIpwBQA9dnGuq5dLR6mjapaAoHn98e9eRe4QzAOihYLXH2XjKlaAwbrlle9eRe4QzAOihoN4OZ0xrolfuvVcavyrsj4/H11FIhDMA6KHO6QCHJ5jWRI+cOCGdPSvdeqtkFj+ePRtfRyENpl0AABRJEEa6ce+IRocG0i4FRXLiBGGsRBg5A4AeinucMWoGYOcIZwDQQ0EYsd4MwK4QzgCgR9xdNU4HALBLhDMA6JFvXllUc6nF6QAAdoVwBgA9stbjjHAGYOcIZwDQI50eZ4ycAdgNwhkA9Ehn5GySDQEAdoFwBgA9EoSR9gwPaGJsKO1SAOQY4QwAeiSoRzpSHZOZpV0KgBwjnAFAj9Tm6HGGLZqZkY4dkyqV+HFmJu2KkCEc3wQAPRLUI714spp2Gci6mRnp5Emp0Yifnz8fP5c4ogmSGDkDgJ5oLC6r3lhipyau75571oJZR6MRXwdEOAOAnqixUxNb9fjj27uO0iGcAUAPzNLjDFt1yy3bu47SIZwBQA/UwqYkTgfAFtx7rzQ+vv7a+Hh8HRDhDAB6IggbGqiYbt4/mnYp2Io0d0ueOCGdPSvdeqtkFj+ePctmAKxKbLemmY1K+itJI+2/8xF3/0Uzu0/Sv5M0137rm9z9kaTqAIB+qIVNHdo/qoEKPc4yLwu7JU+cIIxhU0mOnC1IusPdXyzpdkl3mtnL26/9rLvf3v4imAHIvaBOj7PcSGK3JH3L0EOJhTOPPdN+OtT+8qT+HgCkKQgj1pvlRa93S3ZG4s6fl9zXRuIIaNihRNecmdmAmT0i6UlJD7r7p9sv3Wtmnzez02Y2ssnPnjSzc2Z27tKlS0mWCQC7srzS0sXLTcJZXvR6tyR9y9BjiYYzd19x99slTUp6mZm9UNLdkl4g6aWSDkh65yY/e9bdj7v78YMHDyZZJgDsyhPzC1ppOdOaedHr3ZL0LUOP9WW3pruHkh6SdKe7X2hPeS5I+n1JL+tHDQCQlE4DWnqc5USvd0vStww9llg4M7ODZlZtfz8m6XslfdnMDrevmaTXS/piUjUAQD8E7Qa0TGvmyIkT0mOPSa1W/LibnZP0LUOPJXnw+WFJ95vZgOIQ+GF3f8DM/sLMDkoySY9IemuCNQBA4oLVkTN6nJVSJ9jdc088lXnLLXEwo1UGdiixcObun5f0kg2u35HU3wSANARhpAN7hjU+nOS/d5Fp9C1DD3FCAADsUlCnjQaA3iGcAcAu1cKIKU0APUM4A4BdcPd2A9rx678ZALaAcAYAuxA2ltRYXKHHGYCeIZwBwC50dmoeZVoTQI8QzgBgF9bCWcmmNTnoG0gM+74BYBc6DWhLtSGgc9B35zzJzkHfEu0kgB5g5AwAdqEWRhodqujAnuG0S+kfDvoGEkU4A4BdiHdqjik+ka4kOOgbSBThDAB2Ie5xVrKdmhz0DSSKcAYAuxCEkSbL1kaDg76BRBHOAGCHmksreuqZRR2ZKFk4O3FCOntWuvVWySx+PHuWzQBAj7BbEwB2qNZpo1G2kTOJg76BBDFyBgA7tNbjrIThDEBiCGcAsEOdkbPSbQgAkCjCGQDsUFCPVDHp0ESJGtACSBzhDAB2aDaMdPP+UQ0N8FEKoHf4RAGAHaq1G9ACQC8RzgBgh4IwKudOTQCJIpwBwA6stFwX55psBgDQc4QzANiBS/MLWlpxpjUB9BzhDAB2IAgbkjLegHZmRjp2TKpU4seZmbQrArAFnBAAADsQhE1JGW5AOzMjnTwpNeIQqfPn4+cSnf2BjGPkDAB2IKhnvAHtPfesBbOORiO+DiDTCGcAsAO1MNLE2JD2jmR0AuLxx7d3HUBmEM4AYAeCrPc4u+WW7V0HkBmEMwDYgaCe8R5n994rjY+vvzY+Hl8HkGmEMwDYgcyfDnDihHT2rHTrrZJZ/Hj2LJsBgBzI6GIJAMiuuWhJ8wvL2Q5nUhzECGNA7jByBgDblPmdmgByjXAGANtUC+Nwluk1ZwByi3AGANsUdMIZI2cAEkA4A4BtqoWRhgcres6e4bRLWY/jmoBCYEMAAGzTbHunZqViaZeyhuOagMJg5AwAtimoRzpSHU27jPU4rgkoDMIZAGxTJnuccVwTUBiEMwDYhoXlFT05v6Cj1fHrv7mfOK4JKAzCGQBsw8W5piRlb1qT45qAwiCcAcA2dBrQZq7HGcc1AYXBbk0A2IbZLPc447gmoBAYOQOAbaiFkcykwxMZDGcACoFwBgDbENQj3bRvRMODfHwCSAafLgCwDbW5iAPPASSKcAYA2xDUM9jjDEChEM4AYItaLVctbGZvpyaAQiGcAcAWPXVlQYsrLUbOACSKcAYAW7Ta44xwBiBBhDMA2KKg3eOs8BsCZmakY8ekSiV+nJlJuyKgVGhCCwBbVAszejpAL83MSCdPSo1G/Pz8+fi5RINboE8YOQOALQrqkfaNDmr/6FDapSTnnnvWgllHoxFfB9AXhDMA2KIgbBZ/vdnjj2/vOoCeI5wBwBYFYQl6nN1yy/auA+g5whkAbFFQbxR/M8C990rj4+uvjY/H1wH0BeEMALZgvrmky83lYm8GkOJF/2fPSrfeKpnFj2fPshkA6CN2awLAFtTCpqSS9Dg7cYIwBqSIkTMA2IJaWXqcAUgd4QwAtmC2Hc4miz6tCSB1hDMA2IKgHmlowHRw70japWwP3f6B3GHNGQBsQS2MdHhiTJWKpV3K1tHtH8glRs4AJML92s/zJpc9zuj2D+QS4QxAz01PS6dOrQUy9/j59HSaVe1OUI/ytxmAbv9ALhHOAPSUuxSG0pkzawHt1Kn4eRjmcwRtaaWlJ+ab+etxRrd/IJdYcwagp8yk06fj78+cib8kaWoqvm45WrLVcXGuKXdpMm8jZ/feu37NmUS3fyAHGDkD0HPdAa0jr8FMitebSTnscUa3fyCXCGcAeq4zldmtew1a3gT1OJzlblpTioPYY49JrVb8SDADMo9wBqCnuteYTU3FmWBqav0atLzpjJwdnhhNuRIAZcCaMwA9ZSZVq+vXmHWmOKvVfE5t1sJIN+4d0ejQQNqlACgBwhmAnpuejkfIOkGsE9DyGMykdo+zPE5pAsglpjUBJOLqIJbXYCZ1GtAypQmgPwhnPVa0ruhA2bm7ank8HQBAbhHOeqiIXdGBsnv6yqKaS638tdEAkFuEsx4pYld0APFmAEmMnAHoGzYE9EgRu6IDyHmPMwC5xMhZDxWtKzqAtR5njJwB6BfCWQ8VrSs6gDic7Rke0MTYUNqlACgJwlmPFLErOoB4WvNIdUzGEDiAPmHNWY8UsSs6AKk2RwNaAP1FOOuhonVFBxCPnL14spp2GQBKhGnNHitSV3Sg7BqLy6o3luhxBqCvCGcAsIlOj7NJpjUB9BHhDAA2MVunjQaA/iOcAcAmamFTkpjWBNBXiYUzMxs1s78zs38wsy+Z2bva159nZp82s6+Z2Z+Y2XBSNQDAbgRhQwMV0837R9MuBUCJJDlytiDpDnd/saTbJd1pZi+X9B5Jp939Nkl1SW9JsAYA2LGgHunQ/lENVNjZA6B/rhvOzOxtZnbDdn+xx55pPx1qf7mkOyR9pH39fkmv3+7vBoB+qIVNepwB6LutjJwdkvT3ZvZhM7vTttEm28wGzOwRSU9KelDSP0kK3X25/ZZZSUc3+dmTZnbOzM5dunRpq38SAHomCCNNst4MQJ9dN5y5+3+XdJukD0h6k6Svmdkvm9nzt/CzK+5+u6RJSS+T9G0bvW2Tnz3r7sfd/fjBgwev96cAoKeWV1q6eLnJZgAAfbelNWfu7pIutr+WJd0g6SNm9t4t/nwo6SFJL5dUNbPOyQSTkmrbrBkAEvfE/IJWWs60JoC+28qas/9qZp+R9F5JfyPpX7n7f5b0XZJ++Bo/d9DMqu3vxyR9r6RHJX1K0o+033aXpI/t6j8BACQgaPc4Y+QMQL9t5WzNGyX9kLuf777o7i0ze+01fu6wpPvNbEBxCPywuz9gZv8o6UNm9j8kfU7xdCnQV91noG70HOicDkADWgD9dt1w5u6/cI3XHr3Ga5+X9JINrv+z4vVnQCqmp6UwXDuU3l06dUqqVuPXACneDCARzgD0HycEoFTc42B25kwcyDrB7MyZ+LpvuD0FZTRbj3Rgz7DGhgfSLgVAyWxlWhMoDLN4xEyKA9mZM/H3U1NrI2mAFE9rMmoGIA2MnKF0ugNaB8EMVwvCSEeqHNsEoP8IZyidzlRmt84UJyBJ7t4eORtPuxQAJUQ4Q6l0rzGbmpJarfixew0aEDaW1FhcoccZgFSw5gylYhbvyuxeY9aZ4qxWmdpEbG2nJtOaAPqPcIbSmZ5e39esE9AIZuhYC2dMawLoP6Y1UUpXBzGCGbqtnQ7AyBmA/iOcAcBVamGk0aGKDuwZTrsUACVEOAOAqwTtHmfGkCqAFBDOAOAqcY8zdmoCSAfhDACuUgsjTdJGA0BKCGcA0KW5tKKnnlnk6CYAqSGcAUCXThsNpjUBpIVwBgBdaqs9zghnANJBOAOALms9zghnANJBOAOALrUwUsWkQxM0oAWQDsIZAHSZDSMd2j+qoQE+HgGkg08fAOgS1OlxBiBdhDMA6FKbi3SUHmcAUkQ4A4C2lZbrQthk5AxAqghnANB2aX5Byy2njQaAVBHOAKAtCBuSxLQmgFQRzgCgbbZOA1oA6SOcAUBbLWxKogEtgHQRzgCgLQgbmhgb0t6RwbRLAVBihDMAaAvqEVOaAFJHOAOAtlrYZDMAgNQRzgBAkrsrCBk5A5A+whkASLrcXNYzC8uEMwCpI5wBgOL1ZhI9zgCkj3AGAJKCMA5ntNEAkDbCGQBIqoU0oAWQDYQzAFA8cjY8WNFz9gynXQqAkiOcAYC0ulOzUrG0SwFQcoQzABANaAFkB+EMABSPnB2pjqZdBgAQzgBgYXlFl+YXdLQ6nnYpAEA4A4ALYVOSGDkDkAmEMwClt9pGgwa0ADKAcAag9Gbb4WySaU0AGUA4A1B6QT2SmXRogmlNAOkjnAEovVoY6aZ9Ixoe5CMRQPr4JAJQenEbDdabAcgGwhmA0uucDgAAWUA4A1BqrZbrQthkpyaAzCCcASi1p55Z0OJKi5EzAJlBOANQakGnxxnhDEBGEM4AlFonnLEhAEBWEM4AlFpQ53QAANlCOANQarUw0r7RQe0fHUq7FACQRDgDUHK00QCQNYQzAKUWhE3CGYBMIZwBKLWg3mC9GYBMIZwBKK355pIuN5fZqQkgUwhnAEqrFjYl0eMMQLYQzgCUVhA2JNHjDEC2EM4AlFanx9kka84AZAjhDEBpBWFTQwOmg3tH0i4FAFYRzgCUVhBGOjwxpkrF0i4FAFYRzgCUVo0GtAAyiHAGlJD7tZ+XRVCP2AwAIHMIZ0DJTE9Lp06tBTL3+Pn0dJpV9d/icktPzDdpQAsgcwhnQIm4S2EonTmzFtBOnYqfh2G5RtCeuNyUuzTJyBmAjBlMuwAA/WMmnT4df3/mTPwlSVNT8XUr0br42XYbDaY1AWQNI2dAyXQHtI6yBTMp3gwgiWlNAJlDOANKpjOV2a17DVpZBO1wdnhiNOVKAGA9whlQIt1rzKampFYrfuxeg1YWQT3SjXtHNDo0kHYpALAOa86AEjGTqtX1a8w6U5zVaj6mNlstqdKDf1bW5iKmNAFkEuEMKJnp6XiErBPEOgEtD8Hs6aelF71I+sIXpAMHdve7gnqkFxze15vCAKCHmNYESujqIJaHYCZJH/+4VKvFj7vh7go4HQBARhHOAOTGffetf9ypp68samG5RTgDkEmEMwC5cPmy9PDD8fcPPxw/36mAHmcAMow1ZwAyp16XHn98/bVPflIaGaepkvUAABQZSURBVJEWF6XhYen975de9ar177nlFumGG67/++lxBiDLCGcAMudXf1V673ul0dE4iHXMz689vutd8ZcUB7ZmU3rHO6T3vOf6v7/T44xpTQBZRDgDkDm/8itxa493v3vz6cvu62Nj0i//svTOd27t98/WI+0ZHtDE2NDuiwWAHmPNGYDMqVSku++WHnpIOnQoHkHbyMiIdPiw9Jd/Gb9/q/3PamHc48zysk0VQKkQzgBk1steJn3lK3EA28iRI9KXvyy99KXb+71BGLEZAEBmEc4AZNrwsHThwsavXbwYj55tV40eZwAyjHAGINMefHBtU8D4ePz9+Hj8fGgofn07GovLqjeWGDkDkFmEMwA9dfXh6bs9TP2DH4wX/4+PS295S3yE05vfHG8CuHw5fn07Oj3OJmmjASCjCGcAemZ6Wjp1ai2QucfPp6d39vsWF6VPfELav1/66Eel3/otae9e6X3vi5/v3x+/vrS09d9JGw0AWZdYODOz55rZp8zsUTP7kplNta9Pm1lgZo+0v16TVA0A+sddCkPpzJm1gHbqVPw8DHc2grayIt11l/TVr0qvfvX61+68M77+xjdKy8tb/52dcMa0JoCsSrLP2bKkt7v7Z81sn6TPmFlndchpd/+fCf5tAH1mJp0+HX9/5kz8JUlTU/H1nXStGBuTfvu3N3/95puv/fpGgnqkgYrp5v2b9OcAgJQlNnLm7hfc/bPt7+clPSrpaFJ/D0D6ugNax06DWVJqYaRD+0c1UMlQUQDQpS9rzszsmKSXSPp0+9LbzOzzZvZ7ZrbhSXhmdtLMzpnZuUuXLvWjTAC71JnK7Na9Bi0LgnYDWgDIqsTDmZntlfSnkn7a3S9L+h1Jz5d0u6QLkn59o59z97Puftzdjx88eDDpMgHsUvcas6kpqdWKH7vXoGVBLWxqkvVmADIs0bM1zWxIcTCbcfePSpK7P9H1+u9KeiDJGgD0h1l8Hmb3GrPOFGe1mo2pzeWVli5ebrIZAECmJRbOLD607gOSHnX33+i6ftjdO/2+f1DSF5OqAUB/TU/HI2SdINYJaFkIZpJ08XJTKy1nWhNApiU5cvYKST8h6Qtm9kj72s9L+jEzu12SS3pM0k8mWAOAPrs6iGUlmEnxlKZEjzMA2ZZYOHP3v5a00cfynyX1NwHgWoKwIYkeZwCyjRMCAJQGI2cA8oBwBqA0ZuuRDuwZ1tjwQNqlAMCmCGcASiMII0bNAGQe4QzIsat7h2Wll1hW1QhnAHKAcAbk1PT0+uaunSaw09NpVpVd7q6gHrEZAEDmEc6AHHKXwnB99/1Od/4wZARtI/XGkqKlFXqcAci8RE8IAJCM7u77Z87EX9L67vxYrxZGkqSj1dGUKwGAa2PkDMip7oDWQTDb3Gy9E87GU64EAK6NcAbkVGcqs1uWDhjPmtWRM6Y1AWQc4QzIoe41ZlNTUqsVP3avQcN6QRhpdKiiG8aH0i4FAK6JNWdADplJ1er6NWadKc5qlanNjQT1uI2G8X8cABlHOANyano6HiHrZI1OQCN7bKw2RxsNAPnAtCaQY1cHMYLZ5oJ6pEnWmwHIAcIZgMJrLq3o6SuLnA4AIBcIZwAKL2jv1GRaE0AeEM4AFF6w2uOMcAYg+whnAAqvxsgZgBwhnAEovCCMVDHp0ARHNwHIPsIZgMILwkiH9o9qaICPPADZxycVgMIL6vQ4A5AfhDMAhReEEWdqAsgNwhmAQltpuS7ONdmpCSA3CGcACu3J+aaWW860JoDcIJwBKLTVHmdMawLICcIZgELrnA7AtCaAvCCcASg0whmAvCGcASi0WhipOj6kPSODaZcCAFtCOANQaEE90pEJRs0A5AfhDECh0eMMQN4QzgAUlrsrqEesNwOQK4QzAIV1OVrWlcUVwhmAXCGcASis1Z2aTGsCyBHCGYDC6oQzTgcAkCeEMwCFFdQbkuhxBiBfCGcACqs219TwYEXP2TOcdikAsGWEMwCF1dmpWalY2qUAwJYRzgAU1mxIGw0A+UM4A1BYtTDSkepo2mUAwLYQzgAUUnNpRZfmF3S0Op52KQCwLYQzAIV0ca4piR5nAPKHcAagkNZ6nDGtCSBfCGcACimox+FskmlNADlDOANQSEEYyUw6NMHIGYB8IZwBKKQgjHTTvhEND/IxByBf+NQCUEg1epwByCnCGYBCCsKIA88B5BLhDEDhtFquC2GTNhoAcolwBqBwnnpmQYsrLaY1AeQS4QxA4cy2e5wRzgDkEeEMQOF0epwxrQkgjwhnAAqntno6AOEMQP4QzgAUThBG2jc6qP2jQ2mXAgDbRjgDUDj0OAOQZ4QzAIUzWyecAcgvwhmAwgnCiM0AAHKLcAagUC43lzTfXGYzAIDcIpwBKJQaPc4A5BzhDEChrIYzpjUB5BThDEChrDagZeQMQE4RzgAUymwYaWjAdHDvSNqlAMCOEM4AFEotbOrwxJgqFUu7FADYEcIZgEIJ6g2mNAHkGuEMQKHQ4wxA3hHOABTG4nJLT84v0OMMQK4RzgAUxsW5ptylScIZgBwjnAEojKDd44yRMwB5RjgDUBgBDWgBFADhDEBhdBrQHp4YTbkSANg5whmAwqiFkW7cO6LRoYG0SwGAHSOcASgM2mgAKALCGYDCqIWRjlaZ0gSQb4QzAIXg7vHIGTs1AeQc4QxAITz1zKIWlluEMwC5RzgDUAg1epwBKAjCGYBCoMcZgKIgnAEohM7IGdOaAPKOcAagEGbrkfYMD2hibCjtUgBgVwhnAAqh0+PMzNIuBQB2hXAGoBBqYcRmAACFQDgDUAj0OANQFIQzALl3ZWFZYWOJnZoACiGxcGZmzzWzT5nZo2b2JTObal8/YGYPmtnX2o83JFUDgHJgpyaAIkly5GxZ0tvd/dskvVzST5nZt0v6OUmfdPfbJH2y/RwAdmyWcAagQBILZ+5+wd0/2/5+XtKjko5K+gFJ97ffdr+k1ydVA4By4HQAAEXSlzVnZnZM0kskfVrSze5+QYoDnKSbNvmZk2Z2zszOXbp0qR9lAsipoB5psGK6ef9o2qUAwK4lHs7MbK+kP5X00+5+eas/5+5n3f24ux8/ePBgcgUCyL0gjHRoYlQDFXqcAci/RMOZmQ0pDmYz7v7R9uUnzOxw+/XDkp5MsgYAxUePMwBFkuRuTZP0AUmPuvtvdL30cUl3tb+/S9LHkqoBQDkE9UiThDMABTGY4O9+haSfkPQFM3ukfe3nJf2qpA+b2VskPS7pRxOsAUDBLa+0dPFyk5EzAIWRWDhz97+WtNkCkFcl9XcBlMvFy021XDSgBVAYnBAAINeCOj3OABQL4QxArtXm6HEGoFgIZwByjZEzAEVDOAOQa0EY6cCeYY0ND6RdCgD0BOEMQK4FYZNRMwCFQjgDkGtBvUE4A1AohDMAueXuqoX0OANQLIQzALlVbywpWlqhxxmAQiGcAcgtdmoCKCLCGYDcCkLCGYDiIZwByK3VcMa0JoACIZwByK1aGGl0qKIbxofSLgUAeoZwBiC3gnqko9UxmVnapQBAzxDOAORWEEY6esN42mUAQE8RzgDkVi2MdLQ6mnYZANBThDMAuRQtrujpK4vs1ARQOIQzALlUm4t3anI6AICiIZwByCUa0AIoKsIZgFyixxmAoiKcAcilWhipYtLN+9kQAKBYCGcAcimoRzq0f1RDA3yMASgWPtUA5FIQRmwGAFBIhDMAuRQ3oCWcASgewhmA3FlpuS7ONdmpCaCQCGcAcufJ+aaWW860JoBCIpwByJ3VHmdMawIoIMIZgNzp9DibZOQMQAERzgDkTiecMa0JoIgIZwByJ6hHqo4Pac/IYNqlAEDPEc4A5E4tjHRkglEzAMVEOAOQO/Q4A1BkhDMAueLuCuoRPc4AFBbhDECuXI6WdWVxhXAGoLAIZwByZTZsSKLHGYDiIpwByJVa2JREGw0AxUU4A5ArQb09ckY4A1BQhDMAuRKEkYYHK7px73DapQBAIghnAHKlFjZ1tDomM0u7FABIBOEMQK7MhrTRAFBshDMAuVILIx2pjqZdBgAkhnAGIDeaSyu6NL+go9XxtEsBgMQQzgDkxoW5uI0GPc4AFBnhDEBu1MJIkpjWBFBohDMAuRHU43A2ybQmgAIjnAHIjSCMZCYdmmDkDEBxEc4A5EYQRrpp34iGB/noAlBcfMIByI2gTo8zAMVHOAOQG7W5iAPPARQe4QxALrRargthkzYaAAqPcAYgF556ZkGLKy1NMnIGoOAIZwByYXa1xxnhDECxEc4A5EKnxxnTmgCKjnAGIBdqjJwBKAnCGYBcCMJI+0YHtX90KO1SACBRhDMAuVAL6XEGoBwIZwByYZYGtABKgnAGIBeCMGIzAIBSIJwByLzLzSXNN5fZDACgFAhnADKvs1OTaU0AZUA4A5B5q+GMaU0AJUA4A5B5qw1oGTkDUAKEMwCZNxtGGhowHdw7knYpAJA4whmAzKuFTR2eGFOlYmmXAgCJI5wByLyg3mBKE0BpEM4AZF4tbLIZAEBpEM4AZNricktPzDfpcQagNAhnADLt4lxT7tIk4QxASRDOAGRaQI8zACVDOAOQaZ1wxrQmgLIgnAHItM7pAIcnRlOuBAD6g3AGINOCeqQb945odGgg7VIAoC8IZwAyLQgj1psBKBXCGYBMq4UROzUBlArhDEBmubuCMNKRKuvNAJQH4QxAZj19ZVELyy2ObiqCmRnp2DGpUokfZ2bSrgjIrMG0CwCAzQR12mgUwsyMdPKk1GjEz8+fj59L0okT6dUFZBQjZwAyiwa0BXHPPWvBrKPRiK8DeBbCGYDM6vQ4m6yOp1wJduXxx7d3HSg5whmAzJqtR9ozPKD9Y6zAyLVbbtnedaDkCGcAMqvW7nFmZmmXgt24915p/KrRz/Hx+DqAZyGcAcisuI0G681y78QJ6exZ6dZbJbP48exZNgMAm2CuAEBmBWGk259bTbsM9MKJE4QxYIsSGzkzs98zsyfN7Itd16bNLDCzR9pfr0nq7wPItysLywobS+zUBFA6SU5r3ifpzg2un3b329tff5bg3weQY52dmjSgBVA2iYUzd/8rSd9M6vcDKLaAcAagpNJYc/Y2M3ujpHOS3u7u9Y3eZGYnJbVbSGuhe3oUuXOjpKfSLgI7kvq9e+l70vzruZf6/cOOce/y7Vt388Pm7r0q5Nm/3OyYpAfc/YXt5zcr/i+bS3q3pMPu/uYt/J5z7n48sUKRKO5ffnHv8o37l1/cu3zb7f3raysNd3/C3VfcvSXpdyW9rJ9/HwAAIOv6Gs7M7HDX0x+UxFQlAABAl8TWnJnZH0t6paQbzWxW0i9KeqWZ3a54WvMxST+5xV93Noka0Tfcv/zi3uUb9y+/uHf5tqv7l+iaMwAAAGwPxzcBAABkCOEMAAAgQzIRzjY56umAmT1oZl9rP97Qvm5m9ltm9nUz+7yZfWd6lWOTe/ejZvYlM2uZ2fGr3n93+959xcxe3f+K0W2T+/drZvbl9v++/o+ZVbte4/5lxCb37t3t+/aImf25mR1pX+dzM2M2un9dr/2MmbmZ3dh+zv3LmO0eUbndz85MhDNtfNTTz0n6pLvfJumT7eeS9H2Sbmt/nZT0O32qERu7T8++d1+U9EOS/qr7opl9u6Q3SPqO9s/8tpkN9KFGbO4+Pfv+PSjphe7+IklflXS3xP3LoPv07Hv3a+7+Ine/XdIDkn6hfZ3Pzey5TxsccWhmz5X0HyQ93nWZ+5c992mLR1Tu5LMzE+Fsk6OefkDS/e3v75f0+q7rf+CxhyVVr2rRgT7a6N65+6Pu/pUN3v4Dkj7k7gvu/i+Svi563aVqk/v35+6+3H76sKTJ9vfcvwzZ5N5d7nq6R/HOeInPzcy5xhGHpyW9Q2v3TuL+Zc42j6jc9mdnJsLZJm529wuS1H68qX39qKRvdL1vtn0N2ce9y583S/q/7e+5fzlgZvea2TckndDayBn3LgfM7HWSAnf/h6te4v7lx9vaU8+/11mOpR3cvyyHs83YBtfoB5IP3LscMbN7JC1Lmulc2uBt3L+Mcfd73P25iu/b29qXuXcZZ2bjku7RWqBe9/IG17h/2fM7kp4v6XZJFyT9evv6tu9flsPZE51h2/bjk+3rs5Ke2/W+SUm1PteGneHe5YSZ3SXptZJO+FozRO5fvvyRpB9uf8+9y77nS3qepH8ws8cU36PPmtkhcf9y4RpHVG77/mU5nH1c0l3t7++S9LGu629s7155uaS5zvQnMu/jkt5gZiNm9jzFi1v/LuWacBUzu1PSOyW9zt0bXS9x/zLOzG7revo6SV9uf8/nZsa5+xfc/SZ3P+buxxT/P/TvdPeL4v7lgm1+ROW2PzsTO75pO2zjo55+VdKHzewtinet/Gj77X8m6TWKF9Q1JP2nvheMVZvcu29Kep+kg5I+YWaPuPur3f1LZvZhSf+oeLrsp9x9JaXSoU3v392SRiQ9aGaS9LC7v5X7ly2b3LvXmNm3SmpJOi/pre2387mZMRvdP3f/wCZv5/5lzCb/+9vwiMqdfHZyfBMAAECGZHlaEwAAoHQIZwAAABlCOAMAAMgQwhkAAECGEM4AAAAyhHAGAACQIYQzAACADCGcASgVM3tp+2DiUTPbY2ZfMrMXpl0XAHTQhBZA6ZjZ/5A0KmlM0qy7/0rKJQHAKsIZgNIxs2FJfy+pKenfcAwVgCxhWhNAGR2QtFfSPsUjaACQGYycASgdM/u4pA9Jep6kw+7+tpRLAoBVg2kXAAD9ZGZvlLTs7n9kZgOS/tbM7nD3v0i7NgCQGDkDAADIFNacAQAAZAjhDAAAIEMIZwAAABlCOAMAAMgQwhkAAECGEM4AAAAyhHAGAACQIf8fKztjcxhKaiAAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X_train, y_train, X_test, y_test = data_generator(inland=True)\n",
    "w = primal_SVM(X_train, y_train)\n",
    "SVM_drawer(X_train, y_train, X_test, y_test, w)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Dual SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-25T16:25:38.807038Z",
     "start_time": "2020-03-25T16:25:38.587597Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     pcost       dcost       gap    pres   dres\n",
      " 0: -2.4282e+00 -4.1387e+00  4e+01  6e+00  2e+00\n",
      " 1: -7.8678e-01 -4.4407e-01  1e+01  1e+00  4e-01\n",
      " 2:  4.9327e-03 -1.1769e-01  2e-01  2e-02  4e-03\n",
      " 3: -2.4933e-02 -5.4376e-02  3e-02  8e-18  7e-14\n",
      " 4: -3.8454e-02 -4.2043e-02  4e-03  4e-18  6e-14\n",
      " 5: -4.1578e-02 -4.1638e-02  6e-05  5e-18  9e-14\n",
      " 6: -4.1624e-02 -4.1624e-02  6e-07  1e-17  9e-14\n",
      " 7: -4.1624e-02 -4.1624e-02  6e-09  5e-18  5e-14\n",
      "Optimal solution found.\n",
      "Final weight vector is: [-33.98333015   0.28323918  -0.05499058]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X_train, y_train, X_test, y_test = data_generator(inland=False)\n",
    "w = dual_SVM(X_train, y_train)\n",
    "SVM_drawer(X_train, y_train, X_test, y_test, w)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-25T16:25:41.841923Z",
     "start_time": "2020-03-25T16:25:41.604555Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     pcost       dcost       gap    pres   dres\n",
      " 0: -4.9743e+00 -8.4377e+00  6e+01  9e+00  2e+00\n",
      " 1: -4.8968e+00 -2.3887e+00  2e+01  3e+00  5e-01\n",
      " 2: -1.8059e-01 -8.7088e-02  1e+00  1e-01  2e-02\n",
      " 3: -1.2370e-02 -7.1962e-02  6e-02  5e-17  7e-13\n",
      " 4: -3.4933e-02 -4.2696e-02  8e-03  1e-17  1e-13\n",
      " 5: -4.1277e-02 -4.1747e-02  5e-04  8e-18  6e-14\n",
      " 6: -4.1621e-02 -4.1625e-02  5e-06  5e-18  1e-13\n",
      " 7: -4.1624e-02 -4.1624e-02  5e-08  2e-17  1e-13\n",
      "Optimal solution found.\n",
      "Final weight vector is: [-33.98333462   0.28323921  -0.05499059]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X_train, y_train, X_test, y_test = data_generator(inland=True)\n",
    "w = dual_SVM(X_train, y_train)\n",
    "SVM_drawer(X_train, y_train, X_test, y_test, w)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# SVM Pegasos"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-25T16:26:28.390712Z",
     "start_time": "2020-03-25T16:25:44.197869Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3f4d1ad57fe54bea97f9cc388ddc69a5",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(IntProgress(value=0, max=1000000), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Final weight vector is: [-34.12389726   0.28777998  -0.0636623 ]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmcAAAJcCAYAAAC8DwN/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3dfZBld13n8c+3n7vnIT09mSSTzNwelmJFltWgkaVWrXKDLogU4lMV7ihxpWp0V2rbWRWM2dJmNSq4GkeqtGoETcRWZBELCtwqKRQttUADRB4MiArnzCSTZDhnemZyTz/f7/5x7p2+0+me6Yd77nl6v6q6bt9zb3d/wzHXT34P35+5uwAAAFAMA3kXAAAAgHWEMwAAgAIhnAEAABQI4QwAAKBACGcAAAAFQjgDAAAoEMIZAABAgRDOAFSKmX2Tmf2tmV02s9jM/sbMvtnMmmZ2YJP3f8rM3mhmJ8zMzeyTG16/1cyWzezLffuHAFBrhDMAlWFmByV9UNLbJU1JukvSWyRdlnRe0vdseP+LJb1I0h92Xd7Xvt7xXyR9KcOyAeA6hDMAVfJvJcnd/9Dd19x9wd3/zN0/LekRSa/f8P7XS/qQu0dd194l6b4N7/m9LIsGgG6EMwBV8k+S1szsETP7djM71PXauyR9s5k1JMnMBpSOim0MXr8v6XVmNmhmXy3pgKSP96F2AJBEOANQIe5+RdI3SXJJvy3popl9wMxud/dzkv5S0g+03/5ySWOSPrTh15yX9AVJ36p0BI1RMwB9RTgDUCnu/ri7/5C7H5P0Ykl3Svr19svdU5s/KOkP3H1lk1/ze5J+SNL3Kx1JA4C+IZwBqCx3/7ykh5WGNEl6n6S7zOw/SfpubT0q9seSvkPSv7p7kHWdANBtKO8CAKBXzOyFSkPVH7n7eTM7rnT062OS5O5NM3uvpN+VFLj7o5v9nvb77pV0qU+lA8A1jJwBqJKrkv6DpI+bWVNpKPuspJ/oes8jkqZ1k7Vk7v6ou/9LVoUCwFbM3fOuAQAAAG2MnAEAABRI5uGs3SvoU2b2wfbzh83sS2b2WPvr7qxrAAAAKIt+bAiYkfS4pINd137K3d/bh78NAABQKpmOnJnZMaU7p96R5d8BAACoiqxHzn5d0puUHn/S7UEz+1lJH5H00+6+tPEHzeyUpFOStG/fvq9/4QtfmHGpAFAMX3l2SRcuL+pFRw9qcMDyLgfADn3iE5/4irsf2e3PZ7Zb08xeLelV7v7fzexbJP2ku7/azI5KekrSiKSzkv7F3f/3jX7XPffc448+umk7IgConJ99/2f1J596Qp/+uf8sM8IZUDZm9gl3v2e3P5/ltOY3SnqNmX1Z0rsl3Wtmv+/uFzy1pLQR5EszrAEASieIEk0fniCYATWVWThz9/vd/Zi7n5D0Okl/7u4/0B45k6WfOq9V2iASANAWxommp/blXQaAnOTR52zOzD4j6TOSbpX0CznUAACFtNZynb+UqHF4Iu9SAOSkL2druvtHJX20/f29/fibAFBGT84vaGXNNT1FOAPqihMCAKBAwjiRJEbOgBojnAFAgQRRGs6mD7PmDKgrwhkAFEgYJxoeNN1xcCzvUgDkhHAGAAUSxk0dPzRB81mgxghnAFAgQcROTaDuCGcAUBDurjBK2KkJ1BzhDAAK4lKyoqtLq2qwGQCoNcIZABREEDUliZEzoOYIZwBQEJ0eZ9OsOQNqjXAGAAXR6XF2nJEzoNYIZwBQEGGc6PaDoxobHsy7FAA5IpwBQEGkOzXZDADUHeEMAAoiiJv0OANAOAOAIlhcWdPTV5bYqQmAcAYARdDZqcnIGQDCGQAUQGen5jQNaIHaI5wBQAHQgBZAB+EMAAogjBMdGBvS5MRw3qUAyBnhDAAKIIgSNaYmZGZ5lwIgZ4QzACiAc3HCsU0AJBHOACB3ay3XuUuJGjSgBSDCGQDk7sLlBa2sOSNnACQRzgAgd2GnjQY7NQGIcAYAuQtoQAugC+EMAHIWRImGB01HbxnPuxQABUA4A4CchXFTxw9NaHCANhoACGcAkLsgSnSc9WYA2ghnAJAjd1cY0eMMwDrCGQDkaD5Z0dWlVTUYOQPQRjgDgBx1dmpOH6YBLYAU4QwAchRETUliWhPANYQzAMhRpwEt05oAOghnAJCjIE50+8FRjQ0P5l0KgIIgnAFAjsIo0TQHngPoQjgDgBwFcZMeZwCuQzgDgJwsrqzp6StLbAYAcB3CGQDk5Ny1NhqEMwDrCGcAkJOAnZoANkE4A4Cc0IAWwGYIZwCQkzBq6sDokA5NDOddCoACIZwBQE6COFHj8ITMLO9SABQI4QwAchJGCZsBADwH4QwAcrDWcp27lNDjDMBzEM4AIAcXLi9oZc05HQDAcxDOACAHIT3OAGyBcAYAOQjpcQZgC4QzAMhBECcaHjTdOTmedykACoZwBgA5CKNExw5NaHCANhoArkc4A4AcBHGTKU0AmyKcAUCfubsCepwB2ALhDAD6bD5Z0dXFVUbOAGyKcAYAfdY58JxwBmAzhDMA6LMgakqSpg/TgBbAcxHOAKDPzjFyBuAGCGcA0GdBlOi2A6MaHxnMuxQABUQ4A4A+C2J2agLYGuEMAPosjBI1OPAcwBYIZwDQR4sra3rqyiIjZwC2RDgDgD5iMwCAmyGcAUAfBVE7nDFyBmALhDMA6KNOA9ppRs4AbIFwBgB9dC5OtH90SFP7RvIuBUBBEc4AoI+CqKnG1ITMLO9SABQU4QwA+ogeZwBuhnAGAH2y1nKdjxfYDADghghnANAnT11Z1PJaS9M0oAVwA4QzAOiTIGpKoscZgBsjnAFAn4TtHmesOQNwI4QzAOiTIE40NGA6estY3qUAKDDCGQD0SRglOnZoXEODfPQC2BqfEADQJ2GcqHGYzQAAboxwBgB9EkRNjm0CcFOEMwDog/lkWVcWV9kMAOCmCGcA0AdBe6cmbTQA3AzhDAD6IIjb4YyRMwA3QTgDgD4IaUALYJsIZwDQB0GU6MiBUU2MDOVdCoCCI5wBQB8EccJOTQDbQjgDgD44FyesNwOwLYQzAMjY4sqanrqyqOkpGtACuDnCGYBKcb/x8zycv5TInQPPAWwP4QxAZczOSqdPrwcy9/T57GyeVXX1OCOcAdiGzMOZmQ2a2afM7IPt588zs4+b2RfN7I/MbCTrGgBUn7s0Py+dObMe0E6fTp/Pz+c7gkYDWgA70Y+RsxlJj3c9f6ukh9z9BZIuSXpDH2oAUHFm0kMPSTMzaSAbGEgfZ2bS62b51RbGifaNDOrwPv5bFMDNZRrOzOyYpO+Q9I72c5N0r6T3tt/yiKTXZlkDgProBLRueQczKT3wvHF4nyzvQgCUQtYjZ78u6U2SWu3nhyXNu/tq+/l5SXdt9oNmdsrMHjWzRy9evJhxmQCqoDOV2a17DVpe6HEGYCcyC2dm9mpJz7j7J7ovb/LWTT823f2su9/j7vccOXIkkxoBVEf3GrOZGanVWp/izDOgrbVc5+MFdmoC2LYszxH5RkmvMbNXSRqTdFDpSNqkmQ21R8+OSXoywxoA1ISZNDl5/RqzzhTn5GR+U5tPX1nU8lqLnZoAti2zcObu90u6X5LM7Fsk/aS7nzSz/yvpeyW9W9J9kt6fVQ0A6mV2Nh0h6wSxTkDLc6lXZ6cmDWgBbFcefc7eLOl/mtk/K12D9s4cagBQURuDWN5r8MO4KYk2GgC2L8tpzWvc/aOSPtr+/l8lvbQffxcA8hZEiYYGTHdOjuVdCoCS4IQAAMhQECe669C4hgb5uAWwPXxaAECGwihhShPAjhDOACBDQdSkjQaAHSGcAUBG5pNlXVlcZacmgB0hnAFARsK4feA5I2cAdoBwBgAZudbjjHAGYAcIZwCQkc7I2fFDhDMA20c4A9BzG8+xzPvg8bwEUVO37h/VvtG+tJQEUBGEMwA9NTt7/UHjnQPJZ2fzrCofQZQwpQlgxwhnAHrGXZqfl86cWQ9op0+nz+fn6zeCFsaJpulxBmCHGGsH0DOdg8alNJCdOZN+PzOT/wHk/ba4sqanriyyUxPAjjFyBqCnugNaR92CmSSdv5TInZ2aAHaOcAagpzpTmd2616DVRaeNRoMGtAB2iHAGoGe615jNzEitVvrYvQatLjptNBg5A7BTrDkD0DNm0uTk9WvMOlOck5P1mtoMokQTI4M6vG8k71IAlAzhDEBPzc6mI2SdINYJaHUKZlI6ctaYmpDV7R8cwJ4xrQmg5zbmkTrmkyBqMqUJYFcIZwDQY62W69ylBU0fZjMAgJ0jnAFAjz11ZVHLqy01aEALYBcIZwDQY502GkxrAtgNwhkA9FgYNyVJ0/Q4A7ALhDMA6LEwTjQ4YLpzcizvUgCUEOEMAHosiBLdNTmuoUE+YgHsHJ8cANBjYZyw3gzArhHOAKDHgihhpyaAXSOcAUAPXU5WdHlhhZEzALtGOAOAHgraOzUb7NQEsEuEMwDoIXqcAdgrwhkA9FAYp+GMNWcAdotwBgA9FEaJbt0/qn2jQ3mXAqCkCGcA0ENB3FRjajzvMgCUGOEMAHoojBJNH2YzAIDdI5wBQI8sra7pwpVF1psB2BPCGQD0yLl4Qe7s1ASwN4QzAOiRsN3jjHAGYC8IZwD6zv3Gz8uq0+OMBrQA9oJwBqCvZmel06fXA5l7+nx2Ns+qeiOIEk2MDOrW/SN5lwKgxAhnAPrGXZqfl86cWQ9op0+nz+fnyz+CFsbpgedmlncpAEqMLokA+sZMeuih9PszZ9IvSZqZSa+XPdOEcaJ/cytTmgD2hpEzAH3VHdA6qhDMWi1XGCdsBgCwZ4QzAH3Vmcrs1r0Grayevrqo5dWWGjSgBbBHhDMAfdO9xmxmRmq10sfuNWhl1dmpOU0DWgB7xJozAH1jJk1OXr/GrDPFOTlZ7qnNsBPOmNYEsEeEMwB9NTubjpB1glgnoJU5mEnpgeeDA6Y7Jzn0HMDeMK0JoO82BrGyBzMpnda8a3Jcw4N8rALYGz5FAKAH2KkJoFcIZwDQA50GtACwV4QzANijywsrmk9WCGcAeoJwBgB7xE5NAL1EOAOAPQripiSpMUUDWgB7RzgDgD3qNKBtMHIGoAcIZwCwR2GU6Nb9I9o/SutIAHtHOAOAPQriJpsBAPQM4QwA9iiMEk1z4DmAHiGcAcAeLK2u6cKVRUbOAPQM4QwA9uD8pQW5i3AGoGcIZwCwB/Q4A9BrhDMA2IMgavc4I5whS3Nz0okT0sBA+jg3l3dFyBD7vgFgD4I40cTIoI7sH827FFTV3Jx06pSUpKO0CoL0uSSdPJlfXcgMI2cAsAdhlB54bmZ5l4KqeuCB9WDWkSTpdVQS4QwA9iCIEzYDIFthuLPrKD3CGQDsUqvlCuOEzQDIVqOxs+soPcIZAOzSM1eXtLzaUoMGtMjSgw9KExv+A2BiIr2OSiKcAcAuXdupybQmsnTypHT2rDQ9LZmlj2fPshmgwtitCQC7FMTtHmeEM2Tt5EnCWI0wcgYAuxRGiQYHTHcdGs+7FAAVQjgDgF0K4kR3To5peJCPUgC9wycKAOxSGDU1PcVmAAC9RTgDgF0K4oRjmwD0HOEMAHbh8sKK5pMVNgMA6DnCGQDsQhi1d2oycgagxwhnALALYbuNRoM1ZwB6jHAGALsQxO0GtIycAegxwhkA7EIYJTq8b0T7R+nlDaC3CGcAsAtBxE5NANkgnAHALoRxwk5NAJkgnAHADi2trunJywtqHGYzAIDeI5wBwA6dv7Qgdw48B5ANwhkA7BA9zgBkiXAGADt0rccZ4QxABghnALBDQZRofHhQR/aP5l0KgArKLJyZ2ZiZ/Z2Z/YOZfc7M3tK+/rCZfcnMHmt/3Z1VDQCQhTBuqjE1ITPLuxQAFZTlyNmSpHvd/Wsl3S3plWb2svZrP+Xud7e/HsuwBgDoOXqc4Tnm5qQTJ6SBgfRxbi7vilBimYUzTz3bfjrc/vKs/h4A9EOr5fQ4w/Xm5qRTp6QgkNzTx1OnCGjYtUzXnJnZoJk9JukZSR9294+3X3rQzD5tZg+Z2aaLNszslJk9amaPXrx4McsyAWDbnrm6pKXVFjs1se6BB6Qkuf5akqTXgV3INJy5+5q73y3pmKSXmtmLJd0v6YWSvkHSlKQ3b/GzZ939Hne/58iRI1mWCQDbFkSdA89pQIu2MNzZdeAm+rJb093nJX1U0ivd/UJ7ynNJ0u9Kemk/agCAXgjabTSY1sQ1jcbOrgM3keVuzSNmNtn+flzSt0r6vJkdbV8zSa+V9NmsagCAXjsXJxocMN11aDzvUlAUDz4oTWwI6xMT6XVgF4Yy/N1HJT1iZoNKQ+B73P2DZvbnZnZEkkl6TNKPZlgDAPRUECW6c3JMw4O0iUTbyZPp4wMPpFOZjUYazDrXgR3KLJy5+6clvWST6/dm9TcBIGtBnKjBlCY2OnmSMIae4T/9AGAHwqipxhSbAQBkh3AGANt0ZXFFl5IV2mgAyBThDAC2KYzYqQkge4QzANimoB3OOLoJQJYIZwCwTUGcNqCdpgEtgAwRzgBgm87FiQ7vG9H+0Sy7EAGoO8IZAGxTECVMaQLIHOEMALYpiOhxBiB7hDMA2Ibl1ZYuXF5gpyaAzBHOAGAbzl9K1HKpwWYAABkjnAHANgRxu8cZa84AZIxwBgDbQANaAP1COAOAbQiiROPDgzpyYDTvUgBUHOEMALYhjJtqTE3IzPIuBUDFEc4AYBvCmB5nAPqDcAYAN+HuCuOE9WYA+oJwBgA38czVJS2utBg5A9AXhDMAuImgvVOT0wEA9APhDABuIoiakqRpGtAC6APCGQDcRBgnGjDprsnxvEsBUAOEMwC4iSBKdOfkuEaG+MgEkD0+aQDgJoI4KeexTXNz0okT0sBA+jg3l3dFALaBcAYAN3EuTtSYKtl6s7k56dQpKQgk9/Tx1CkCGlAChDMAuIGriyuKm8vlGzl74AEpSa6/liTpdQCFRjgDgBsobRuNMNzZdQCFQTgDgBsI45KGs0ZjZ9cBFAbhDABuoDNyVrppzQcflCY21DwxkV4HUGiEMwC4gTBuamrfiA6MDeddys6cPCmdPStNT0tm6ePZs+l1AIU2lHcBAFBkQZSUb0qz4+RJwhhQQoycAcANBFFJe5wBKC3CGQBsYXm1pQuXFzRd1pEzAKVEOAOALTwxv6CWSw0OPAfQR4QzANhCEDUllaiNBsc1AZXAhgAA2EKnx1kp1px1jmvqnArQOa5JYlMAUDKMnAHAFoIo0djwgG47MJp3KTfHcU1AZRDOAGALnTYaZpZ3KTfHcU1AZRDOAGALYdxUY6okmwE4rgmoDMIZAGzC3RXGJepxxnFNQGUQzgBgExevLmlxpVWecMZxTUBlsFsTADYRtHdqlqaNhsRxTUBFMHIGAJsIok4bjZKsOQNQGYQzANhEGDU1YNJdk+N5lwKgZghnALCJIE509JZxjQzxMQmgv/jUAYBNBFGJdmoCqBTCGQBsolRtNABUCuEMADa4uriiuLlcnga0ACqFcAYAG5TqwHMAlUM4A4ANwqiEPc56aW5OOnFCGhhIH+fm8q4IqBWa0ALABtca0NZx5GxuTjp1SkrS/w0UBOlziQa3QJ8wcgYAGwRRokMTwzo4Npx3Kf33wAPrwawjSdLrAPqCcAYAG4RxU426ngwQhju7DqDnCGcAsEEQJZqu63qzRmNn1wH0HOEMALosr7b05PxCfXdqPvigNLHhn31iIr0OoC8IZwDQ5Yn5BbW8xjs1T56Uzp6Vpqcls/Tx7Fk2AwB9xG5NAOgSRE1J0nRd15xJaRAjjAG5YeQMALqcowEtgJwRzgCgSxAlGhse0G0HRvMuBUBNEc4AoEsQJ2pMTcjM8i6lN+j2D5QOa84AoEsYJdXZDEC3f6CUGDkDkAn3Gz8vIndXGCdqTFVkMwDd/oFSIpwB6LnZWen06fVA5p4+n53Ns6qbu3h1SQsra9XZDEC3f6CUCGcAespdmp+XzpxZD2inT6fP5+eLPYJWuQPP6fYPlBJrzgD0lJn00EPp92fOpF+SNDOTXi/yOvsgarfRqMqaswcfvH7NmUS3f6AEGDkD0HPdAa2j6MFMksI40YBJxw5VJJzR7R8oJcIZgJ7rTGV2616DVlRh1NTRW8Y1MlShj8aTJ6Uvf1lqtdJHghlQeBX6BAJQBN1rzGZm0kwwM3P9GrSiCuKkOpsBAJQWa84A9JSZNDl5/RqzzhTn5GSxpzbDKNG3vej2vMsAUHOEMwA9NzubjpB1glgnoBU5mD27tKqouVydnZoASotpTQCZ2BjEihzMJCmImpKk6ao0oAVQWoQzAFA6pSmJNWcAckc4AwBVsAEtgNIinAGA0h5nhyaGdXBsOO9SANQc4QwAlE5rNg6z3gxA/ghnACApiJvVObYJQKkRzgDU3spaS0/OL7IZAEAhEM4A1N4Tlxa01nIdZ+QMQAEQzgDUXmenJtOaAIqAcAag9sJOA1o2BAAoAMIZgNoLokSjQwO67cBo3qUAAOEMAMI4UWNqQgMDBT9jCkAtEM4A1F4YJ+zUBFAYhDMAtebu7ZEz1psBKIbMwpmZjZnZ35nZP5jZ58zsLe3rzzOzj5vZF83sj8xsJKsaAOBmLj67pGR5jZEzAIWR5cjZkqR73f1rJd0t6ZVm9jJJb5X0kLu/QNIlSW/IsAYAuKEwah94ThsNAAVx03BmZm80s0M7/cWeerb9dLj95ZLulfTe9vVHJL12p78bAHol6IQzRs4AFMR2Rs7ukPT3ZvYeM3ulmW17O5OZDZrZY5KekfRhSf8iad7dV9tvOS/pri1+9pSZPWpmj168eHG7fxIAdiSIE5lJxw6N510KAEjaRjhz9/8l6QWS3inphyR90cx+0cyev42fXXP3uyUdk/RSSV+92du2+Nmz7n6Pu99z5MiRm/0pANiVMGrqzlvGNTo0mHcpACBpm2vO3N0lPdX+WpV0SNJ7zext2/z5eUkflfQySZNmNtR+6ZikJ3dYMwD0TKfHGQAUxXbWnP0PM/uEpLdJ+htJ/97d/5ukr5f0PTf4uSNmNtn+flzSt0p6XNJfSPre9tvuk/T+Pf0TAMAe0OMMQNEM3fwtulXSd7t70H3R3Vtm9uob/NxRSY+Y2aDSEPged/+gmf2jpHeb2S9I+pTS6VIA6Ltnl1b1lWeX2QwAoFBuGs7c/Wdv8NrjN3jt05Jessn1f1W6/gwActVpozFNA1oABcIJAQBqK4ybksS0JoBCIZwBqK1Oj7PjbAgAUCCEMwC1FcSJJieGdcv4cN6lAMA1hDMAtRVGiaYZNQNQMIQzALUVxE01DrMZAECxEM4A1NLKWktPzi8ycgagcAhnAGrpyfkFrbWcHmcACodwBqCWgms9zghnAIqFcAagloK4Hc5YcwagYAhnAGopjJoaGRrQbQdG8y4FAK5DOANQS0GUqDE1oYEBy7sUALgO4QxALYUxPc4AFBPhDEDtuLvCOGGnJoBCIpwBqJ2vPLusZHmNkTMAhUQ4A1A7YdyUxE5NAMVEOANQO50eZ0xrAigiwhmA2gmiRGbSsUPjeZcCAM9BOANQO2Gc6OjBMY0ODeZdCgA8B+EMQO0EUZMpTQCFRTgDUDtpjzM2AwAoJsIZgFp5dmlVX3l2mZEzAIVFOANQK+euHXhOOANQTIQzALXSaaPBtCaAoiKcAaiVTgNapjUBFBXhDECtBFGiyYlh3TI+nHcpALApwhmAWkl3ajJqBqC4CGcAaiWIEh0nnAEoMMIZgNpYWWvpifkFdmoCKDTCGYDaeHJ+QWstZ6cmgEIjnAGojbDd44ydmgCKjHAGoDau9TgjnAEoMMIZgNoI40QjQwO6/cBY3qUAwJYIZwBqI4iaakxNaGDA8i4FALZEOANQG0FEjzMAxUc4A1AL7q4wpscZgOIjnAGoha88u6xkeY3NAAAKj3AGoBY6B54TzgAUHeEMQC1c63FGA1oABUc4A1ALQZTITDo+NZ53KQBwQ4QzALUQRomOHhzT6NBg3qUAwA0RzgDUQhAnHNsEoBQIZwBqIe1xxnozAMVHOANQec2lVX3l2SVGzgCUAuEMQOWt79QknAEoPsIZgMoLojSc0eMMQBkQzgBU3rUGtKw5A1AChDMAlRfGiW4ZH9YtE8N5lwIAN0U4A1B5QZQwpQmgNAhnACovjBM2AwAoDcIZgEpbXWvpiUsLjJwBKA3CGYBKe3J+UastZzMAgNIgnAGotKC9U/M405oASoJwBqDS6HEGoGwIZwAqLYwTjQwN6I6DY3mXAgDbQjgDUGlhlOj4oXENDFjepQDAthDOAFRaECeaPsxmAADlQTgDUFnurjBq0uMMQKkQzgBUVtRcVnN5jc0AAEqFcAagstipCaCMCGcAKits9zhr0IAWQIkQzgBUVhAlMpOOHRrPuxQA2DbCGVBD7jd+XhVhlOiOg2MaGx7MuxQA2DbCGVAzs7PS6dPrgcw9fT47m2dV2QjjhJ2aAEqHcAbUiLs0Py+dObMe0E6fTp/Pz1dvBC3tcUY4A1AuQ3kXAKB/zKSHHkq/P3Mm/ZKkmZn0ulWoiX6yvKqLV5doQAugdBg5A2qmO6B1VC2YSemUpiSmNQGUDuEMqJnOVGa37jVoVUGPMwBlRTgDaqR7jdnMjNRqpY/da9CqIuyEM3qcASgZ1pwBNWImTU5ev8asM8U5OVmOqc1WSxrYxn9WBnFTB8eGdMvEcPZFAUAPEc6AmpmdTUfIOkGsE9DKEMyiSPqar5E+8xlpaurG7w2ihM0AAEqJaU2ghjYGsTIEM0n6wAekJ59MH2/mXJyowXozACVEOANQGg8/fP3jVlbXWjp/aUHT7NQEUEKEMwClcOWK9LGPpd9/7GPp861cuLyo1ZazUxNAKbHmDEDhXLokheH11z7yEWl0VFpelkZGpHe8Q3r5y69/T6MhHTq03kajwU5NACVEOANQOL/8y9Lb3iaNjaVBrOPq1fXHt7wl/ZLSwLa4KL3pTdJb35ru1JTocQagnAhnAArnl34pbe3x8z+/9fRl9/XxcekXf1F685vT52GUaGRwQHccHMu+WADoMdacASicgQHp/vulj35UuuOOdARtM6Oj0tGj0l/+Zfr+TjCCb0kAABPmSURBVP+zIEp0bGpcAwMl2YYKAF0IZwAK66Uvlb7whTSAbebOO6XPf176hm+4/noQJ+zUBFBahDMAhTYyIl24sPlrTz2Vjp51c3eFUZMGtABKi3AGoNA+/OH1TQETE+n3E+1BseHh9PVucXNZzeU1NRg5A1BShDMAPbXx8PS9Hqb+rneli/8nJqQ3vCE9wumHfzjdBHDlSvp6tyBuH3jOTk0AJUU4A9Azs7PS6dPrgcw9fT47u7vft7wsfehD0sGD0vveJ/3Gb0j790tvf3v6/ODB9PWVlfWfCSPCGYByyyycmdlxM/sLM3vczD5nZjPt67Nm9oSZPdb+elVWNQDoH3dpfl46c2Y9oJ0+nT6fn9/dCNramnTffdI//ZP0ildc/9orX5lef/3rpdXV9etBlMhMOnaIcAagnLLsc7Yq6Sfc/ZNmdkDSJ8ysszrkIXf/Pxn+bQB9ZiY99FD6/Zkz6Zckzcyk13dzuPr4uPSbv7n167ff/tzXg7ipOw6OaWx4cOd/EAAKILORM3e/4O6fbH9/VdLjku7K6u8ByF93QOvYbTDbrTBK2AwAoNT6subMzE5Ieomkj7cvvdHMPm1mv2Nmh7b4mVNm9qiZPXrx4sV+lAlgjzpTmd2616D1QxATzgCUW+bhzMz2S/pjST/u7lck/Zak50u6W9IFSb+62c+5+1l3v8fd7zly5EjWZQLYo+41ZjMzUquVPnavQctasryqi1eX2AwAoNQyPVvTzIaVBrM5d3+fJLn7012v/7akD2ZZA4D+MEvPw+xeY9aZ4pyc7M/U5rl4QZLUoAEtgBLLLJyZmUl6p6TH3f3Xuq4fdfdOv+/vkvTZrGoA0F+zs+kIWSeIdQJav9acBVFTkji6CUCpZTly9o2SflDSZ8zssfa1n5H0/WZ2tySX9GVJP5JhDQD6bGMQ6+tmABrQAqiAzMKZu/+1pM0+lv80q78JoN6CKNHBsSFNTozkXQoA7BonBACojCBOOPAcQOkRzgBURhg11WBKE0DJEc4AVMLqWkvnLy3Q4wxA6RHOgBLb2Dusn81ei+bC5UWttpydmgBKj3AGlNTs7PXNXTtNYGdn86wqP52dmkxrAig7whlQQu7S/Pz13fc73fnn5+s5ghZEnTYabAgAUG6ZnhAAIBvd3ffPnEm/pOu789dNEDc1MjigOw6O5V0KAOwJI2dASXUHtI66BjNJCqNEx6bGNThQ0/8BAFQG4Qwoqc5UZrd+HTBeREGUsBkAQCUQzoAS6l5jNjMjtVrpY/catDpxd4U0oAVQEaw5A0rITJqcvH6NWWeKc3KyflObcXNZzy6t0uMMQCUQzoCSmp1NR8g6QawT0OoWzKT02CZJhDMAlcC0JlBiG4NYHYOZJJ2LO200CGcAyo9wBqD0Oj3OjjNyBqACCGcASi+IEt1xcExjw4N5lwIAe0Y4A1B6Ydzk2CYAlUE4A1B69DgDUCWEMwCltrC8pmeuLrEZAEBlEM4AlFrYaaNBA1oAFUE4A1BqQdSURI8zANVBOANQap2RM9acAagKwhmAUgvjRAfGhjQ5MZx3KQDQE4QzAKUWRImmD0/I6no8AoDKIZwBKLUwTjQ9xWYAANVBOANQWmst1/lLCQ1oAVQK4QxAaT05v6CVNWczAIBKIZwBKK31HmeEMwDVQTgDUFpB1G6jQQNaABVCOANQWkHc1PCg6Y6DY3mXAgA9QzgDUFrn4kTHD01ocIA2GgCqg3AGoLSCiJ2aAKqHcAaglNxdYZSwUxNA5RDOAJTSpWRFV5dW1WAzAICKIZwBKKUgakriwHMA1UM4A1BKnR5n06w5A1AxhDMApdTpcXackTMAFUM4A1BKQZTo9oOjGhsezLsUAOgpwhmAUjoXJ5qeYjMAgOohnAEopSBu0uMMQCURzgCUzuLKmp6+ssROTQCVRDgDUDqdnZqMnAGoIsIZgNLp7NScpgEtgAoinAEoHRrQAqgywhmA0gnjRAfGhjQ5MZx3KQDQc4QzAKUTRIkaUxMys7xLAYCeI5wBKJ1zccKxTQAqi3AGoFTWWq5zlxI1aEALoKIIZwBK5cLlBa2sOSNnACqLcAagVMJOGw12agKoKMIZgFIJaEALoOIIZwBKJYgSDQ+ajt4ynncpAJAJwhmAUgnjpo4fmtDgAG00AFQT4QxAqQRRwpQmgEojnAEoDXdX2G5ACwBVRTgDUBrzyYquLq0SzgBUGuEMQGl0dmpOH6YBLYDqIpwBKI0gakoSDWgBVBrhDEBpdBrQMq0JoMoIZwBKI4gT3X5wVGPDg3mXAgCZIZwBKI0wSjTNgecAKo5wBqA0grhJjzMAlUc4A1AKiytrevrKEuvNAFQe4QxAKZy71kaDcAag2ghnAEohYKcmgJognAEoBRrQAqgLwhmAUgijpg6MDunQxHDepQBApghnAEohiBM1Dk/IzPIuBQAyRTgDUAphlLAZAEAtEM4AFN5ay3XuUqIGDWgB1ADhDEDhXbi8oJU1Z+QMQC0QzgAUXhjTRgNAfRDOABReSI8zADVCOANQeEGcaHjQdOfkeN6lAEDmCGcACi+MEh07NKHBAdpoAKg+whmAwgviJlOaAGqDcAag0NxdAT3OANQI4QxAoc0nK7q6uMrIGYDaIJwBKDQOPAdQN4QzAIVGjzMAdUM4A1BoYdSURDgDUB+EMwCFFkSJbjswqvGRwbxLAYC+yCycmdlxM/sLM3vczD5nZjPt61Nm9mEz+2L78VBWNQAovyBmpyaAesly5GxV0k+4+1dLepmkHzOzF0n6aUkfcfcXSPpI+zkAbCqMEjWm2AwAoD4yC2fufsHdP9n+/qqkxyXdJek7JT3Sftsjkl6bVQ0Aym1xZU1PXVlk5AxArfRlzZmZnZD0Ekkfl3S7u1+Q0gAn6bYtfuaUmT1qZo9evHixH2UCKJhz19poEM4A1Efm4czM9kv6Y0k/7u5Xtvtz7n7W3e9x93uOHDmSXYEACiuIaKMBoH4yDWdmNqw0mM25+/val582s6Pt149KeibLGgCUFz3OANRRlrs1TdI7JT3u7r/W9dIHJN3X/v4+Se/PqgYA5RbGifaPDmlq30jepQBA3wxl+Lu/UdIPSvqMmT3WvvYzkn5Z0nvM7A2SQknfl2ENAEosiJpqTE0o/W89AKiHzMKZu/+1pK0+UV+e1d8FUB1BnOirbj+QdxkA0FecEACgkNZarvPxghrs1ARQM4QzAIX01JVFLa+1NE0DWgA1QzgDUEhB+8BzepwBqBvCGYBCCulxBqCmCGcACimMEw0NmI7eMpZ3KQDQV4QzAIUUxImOHRrX0CAfUwDqhU89AIUURokah9kMAKB+CGcACimImppmvRmAGiKcASic+WRZVxZX2akJoJYIZwAKJ2CnJoAaI5wBKJwgTsPZNGvOANQQ4QxA4YTtBrSMnAGoI8IZgMIJ40RHDoxqfGQw71IAoO8IZwAKJ4gSdmoCqC3CGYDCCeNEDXZqAqgpwhmAQllcWdNTVxY1PcVmAAD1RDgDUCjnLyVyFz3OANQW4QxAoVzrcUY4A1BThDMAhdIJZ2wIAFBXhDMAhRLGifaPDmlq30jepQBALghnAAoljBM1piZkZnmXAgC5IJwBKJQganIyAIBaI5wBKIxWy3Xu0gI7NQHUGuEMQGE8dWVRy6stdmoCqDXCGYDCWN+pSQNaAPVFOANQGGHclEQDWgD1RjgDUBhBlGhowHT0lrG8SwGA3BDOABRGECc6dmhcQ4N8NAGoLz4BARTGuThR4zDrzQDUG+EMQGEEUaLG1HjeZQBArghnAArhcrKiywsr7NQEUHuEMwCFELR3atLjDEDdEc4AFMK1HmeEMwA1RzgDUAhhnIYzztUEUHeEMwCFEERNHTkwqomRobxLAYBcEc4AFEIQJZpm1AwACGcAiiHtcUY4AwDCGYDcLa2u6cKVRdabAYAIZwAK4Fy8IHd2agKARDgDUABhp8cZDWgBgHAGIH/0OAOAdYQzALkLokT7RgZ1eN9I3qUAQO4IZwByF8aJGof3yczyLgUAckc4A5C7IGrS4wwA2ghnAHLVarnOXVpgvRkAtBHOAOTq6auLWl5t6TgjZwAgiXAGIGfs1ASA6xHOAOQq7IQzepwBgCTCGYCcBXFTQwOmOyfH8i4FAAqBcAYgV0GU6K5D4xoa5OMIACTCGYCchXHCgecA0IVwBiBXQZSwGQAAuhDOAOTmcrKiywsrbAYAgC6EMwC5CeN0pyY9zgBgHeEMQG6CuCmJHmcA0I1wBiA3nQa0bAgAgHWEMwC5CaNEt+4f1b7RobxLAYDCIJwByE0QN5nSBIANCGcAchNGiaaZ0gSA6xDOAORiaXVNF64sqsHIGQBch3AGIBfnLy3InZ2aALAR4QxALkJ2agLApghnAHIRRGmPswanAwDAdQhnAHIRxIkmRgZ16/6RvEsBgEIhnAHIRRglakxNyMzyLgUACoVwBiAXQZywGQAANkE4A9B3rZYrjBNNH2a9GQBsRDgD0HdPX13U8mqLnZoAsAnCGYC+67TRYFoTAJ6LcAag74KYHmcAsBXCGYC+C6NEgwOmOyfH8y4FAAqHcAag74I40V2T4xoe5CMIADbikxFA34VRk/VmALAFwhmAvgvihPVmALAFwhmAvrq8sKL5ZIWRs7qZm5NOnJAGBtLHubm8KwIKayjvAgDUS6eNBgee18jcnHTqlJSk915BkD6XpJMn86sLKChGzgD0VRjT46x2HnhgPZh1JEl6HcBzEM4A9FUQNyVJx1lzVh9huLPrQM0RzgD0VRglunX/iPaPsqqiNhqNnV0Hao5wBqCvgoidmrXz4IPSxIZ7PjGRXgfwHIQzAH0VxommD7MZoFZOnpTOnpWmpyWz9PHsWTYDAFtgXgFA3yytrunJywuMnNXRyZOEMWCbMhs5M7PfMbNnzOyzXddmzewJM3us/fWqrP4+gOI5f2lB7uzUBIAbyXJa82FJr9zk+kPufnf7608z/PsACqbT44xwBgBbyyycuftfSYqz+v0AyqfT44wGtACwtTzWnL3RzF4v6VFJP+HulzZ7k5mdktRuIa2l7ulRlM6tkr6SdxHYlUzu3W1v7fVvxBb4d6+8uHfl9lV7+WFz914V8txfbnZC0gfd/cXt57cr/T82l/Tzko66+w9v4/c86u73ZFYoMsX9Ky/uXblx/8qLe1due71/fW2l4e5Pu/uau7ck/bakl/bz7wMAABRdX8OZmR3tevpdkpiqBAAA6JLZmjMz+0NJ3yLpVjM7L+nnJH2Lmd2tdFrzy5J+ZJu/7mwWNaJvuH/lxb0rN+5feXHvym1P9y/TNWcAAADYGY5vAgAAKBDCGQAAQIEUIpxtcdTTlJl92My+2H481L5uZvYbZvbPZvZpM/u6/CrHFvfu+8zsc2bWMrN7Nrz//va9+4KZvaL/FaPbFvfvV8zs8+1/v/7EzCa7XuP+FcQW9+7n2/ftMTP7MzO7s32dz82C2ez+db32k2bmZnZr+zn3r2B2ekTlTj87CxHOtPlRTz8t6SPu/gJJH2k/l6Rvl/SC9tcpSb/VpxqxuYf13Hv3WUnfLemvui+a2YskvU7Sv2v/zG+a2WAfasTWHtZz79+HJb3Y3b9G0j9Jul/i/hXQw3ruvfsVd/8ad79b0gcl/Wz7Op+bxfOwNjni0MyOS/o2SWHXZe5f8TysbR5RuZvPzkKEsy2OevpOSY+0v39E0mu7rv+epz4maXJDiw700Wb3zt0fd/cvbPL275T0bndfcvcvSfpn0esuV1vcvz9z99X2049JOtb+nvtXIFvcuytdT/cp3Rkv8blZODc44vAhSW/S+r2TuH+Fs8MjKnf82VmIcLaF2939giS1H29rX79L0rmu951vX0Pxce/K54cl/b/299y/EjCzB83snKSTWh85496VgJm9RtIT7v4PG17i/pXHG9tTz7/TWY6lXdy/Ioezrdgm1+gHUg7cuxIxswckrUqa61za5G3cv4Jx9wfc/bjS+/bG9mXuXcGZ2YSkB7QeqK97eZNr3L/i+S1Jz5d0t6QLkn61fX3H96/I4ezpzrBt+/GZ9vXzko53ve+YpCf7XBt2h3tXEmZ2n6RXSzrp680QuX/l8geSvqf9Pfeu+J4v6XmS/sHMvqz0Hn3SzO4Q968UbnBE5Y7vX5HD2Qck3df+/j5J7++6/vr27pWXSbrcmf5E4X1A0uvMbNTMnqd0cevf5VwTNjCzV0p6s6TXuHvS9RL3r+DM7AVdT18j6fPt7/ncLDh3/4y73+buJ9z9hNL/h/517v6UuH+lYFsfUbnjz87Mjm/aCdv8qKdflvQeM3uD0l0r39d++59KepXSBXWJpP/a94JxzRb3Lpb0dklHJH3IzB5z91e4++fM7D2S/lHpdNmPuftaTqVDW96/+yWNSvqwmUnSx9z9R7l/xbLFvXuVmX2VpJakQNKPtt/O52bBbHb/3P2dW7yd+1cwW/z7t+kRlbv57OT4JgAAgAIp8rQmAABA7RDOAAAACoRwBgAAUCCEMwAAgAIhnAEAABQI4QwAAKBACGcAAAAFQjgDUCtm9g3tg4nHzGyfmX3OzF6cd10A0EETWgC1Y2a/IGlM0rik8+7+SzmXBADXEM4A1I6ZjUj6e0mLkv4jx1ABKBKmNQHU0ZSk/ZIOKB1BA4DCYOQMQO2Y2QckvVvS8yQddfc35lwSAFwzlHcBANBPZvZ6Savu/gdmNijpb83sXnf/87xrAwCJkTMAAIBCYc0ZAABAgRDOAAAACoRwBgAAUCCEMwAAgAIhnAEAABQI4QwAAKBACGcAAAAF8v8BbeiM4PVmQN8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X_train, y_train, X_test, y_test = data_generator(inland=False)\n",
    "np.random.seed()\n",
    "w_init = np.random.randn(3)\n",
    "w = SVM_pegasos(X_train, y_train, w_init, 1000000, weight_decay=0.001, lr=8)\n",
    "SVM_drawer(X_train, y_train, X_test, y_test, w)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-25T16:27:24.698141Z",
     "start_time": "2020-03-25T16:26:28.468480Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "141354dae76c4cf6b860724a01e9db81",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(IntProgress(value=0, max=1000000), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Final weight vector is: [-32.75762887   0.27500985  -0.0642037 ]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X_train, y_train, X_test, y_test = data_generator(inland=True)\n",
    "np.random.seed()\n",
    "w_init = np.random.randn(3)\n",
    "w = SVM_pegasos(X_train, y_train, w_init, 1000000, weight_decay=0.01, lr=8)\n",
    "SVM_drawer(X_train, y_train, X_test, y_test, w)"
   ]
  }
 ],
 "metadata": {
  "hide_input": false,
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
